package com.ssish.common.insurance.utils;  
  
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
//import java.util.Base64;

import org.apache.commons.codec.binary.Base64;

  
/**
 *   
 * <P>Description: Base64Utils工具类</P>
 * @ClassName: Base64Utils
 * @author jie.xu  2017年3月29日 上午11:05:28
 * @see TODO
 */
public class Base64Utils {
	public static void main(String[] args) {
		String base64String=Base64Utils.encodeToString("国家".getBytes());
		System.out.println(base64String);
		String str=Base64Utils.decodeToString(base64String);
		System.out.println(str);
	}
  
	/**
	 * 读取文件缓存区大小
	 */
    private static final int CACHE_SIZE = 1024;  
      
   /**
    *  
    * <p>Title: BASE64字符串解码为字节数组 </p>
    * <p>Description: TODO</p>
    * @param base64
    * @return
    * @author jie.xu  2017年3月29日 上午11:06:26
    */
    public static byte[] decode(String base64){
        try {
//			return Base64.getDecoder().decode(base64.getBytes("UTF-8"));
        	return Base64.decodeBase64(base64.getBytes("UTF-8"));
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}  
        return null;
    }
    /**
     * 
     * <p>Title: BASE64字符串解码为字符串</p>
     * <p>Description: TODO</p>
     * @param base64
     * @return
     * @author jie.xu  2017年3月29日 上午11:20:26
     */
    public static String decodeToString(String base64){
    	byte[] byteData=decode(base64);
    	return new String(byteData);
    }
    /**
     *  
     * <p>Title: 字节数组编码成base64字节数组</p>
     * <p>Description: TODO</p>
     * @param bytes
     * @return
     * @author jie.xu  2017年3月29日 上午11:26:06
     */
    public static byte[] encode(byte[] bytes){
    	//return Base64.getEncoder().encode(bytes);
    	return Base64.encodeBase64(bytes);
    }
    /**
     *   
     * <p>Title: 字节数组编码为BASE64字符串 </p>
     * <p>Description: TODO</p>
     * @param bytes
     * @return
     * @author jie.xu  2017年3月29日 上午11:06:39
     */
    public static String encodeToString(byte[] bytes){  
        //return new String(Base64.getEncoder().encode(bytes));  
    	return new String(Base64.encodeBase64(bytes));  
    }  
      
    /**
     * 
     * <p>Title: 将文件编码为BASE64字符串 </p>
     * <p>Description: 大文件慎用，可能会导致内存溢出</p>
     * @param filePath 文件绝对路径 
     * @return
     * @author jie.xu  2017年3月29日 上午11:07:03
     */
    public static String encodeFile(String filePath){  
        byte[] bytes = fileToByte(filePath);  
        return encodeToString(bytes);  
    }  
      
    /**
     * 
     * <p>Title: BASE64字符串转文件 </p>
     * <p>Description: TODO</p>
     * @param filePath 文件绝对路径 
     * @param base64 编码字符串 
     * @throws Exception
     * @author jie.xu  2017年3月29日 上午11:11:17
     */
    public static void decodeToFile(String filePath, String base64){  
        byte[] bytes = decode(base64);  
        byteArrayToFile(bytes, filePath);  
    }  
      
    /**
     * 
     * <p>Title: 文件转换为字节数组 </p>
     * <p>Description: TODO</p>
     * @param filePath 文件路径
     * @return
     * @author jie.xu  2017年3月29日 上午11:21:46
     */
    public static byte[] fileToByte(String filePath){  
        byte[] data = new byte[0];  
        File file = new File(filePath);  
        if (file.exists()) {  
            FileInputStream in=null;
            ByteArrayOutputStream out=null;
			try {
				in = new FileInputStream(file);
				out = new ByteArrayOutputStream(2048);  
				byte[] cache = new byte[CACHE_SIZE];  
				int nRead = 0;  
				while ((nRead = in.read(cache)) != -1) {  
					out.write(cache, 0, nRead);  
					out.flush();  
				}  
				data = out.toByteArray();  
			} catch (FileNotFoundException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}finally{
				if(out!=null){
					try {
						out.close();
					} catch (IOException e) {
						e.printStackTrace();
					}  
					
				}
				if(in!=null){
					try {
						in.close();
					} catch (IOException e) {
						e.printStackTrace();
					}  
				}
				out=null;
				in=null;
			}
         }  
        return data;  
    }  
      
    /**
     * 
     * <p>Title: 字节数组写入文件 </p>
     * <p>Description: TODO</p>
     * @param bytes 字节数组
     * @param filePath 文件路径 
     * @author jie.xu  2017年3月29日 上午11:14:49
     */
    public static void byteArrayToFile(byte[] bytes, String filePath){  
        InputStream in = new ByteArrayInputStream(bytes);     
        File destFile = new File(filePath);
        OutputStream out=null;
        if (!destFile.getParentFile().exists()) {  
            destFile.getParentFile().mkdirs();  
        }  
        try {
			destFile.createNewFile();
			out = new FileOutputStream(destFile);  
			byte[] cache = new byte[CACHE_SIZE];  
			int nRead = 0;  
			while ((nRead = in.read(cache)) != -1) {     
				out.write(cache, 0, nRead);  
				out.flush();  
			}  
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			if(out!=null){
				try {
					out.close();
				} catch (IOException e) {
					e.printStackTrace();
				}  
			}
			if(in!=null){
				try {
					in.close();
				} catch (IOException e) {
					e.printStackTrace();
				}  
			}
			out=null;
			in=null;
		}
    }  
      
      
}  
